#ifndef GLOBALTABLE_HPP
#define GLOBALTABLE_HPP

#include <QFont>
#include <QString>
#include <QCryptographicHash>
#include <map>
#include <QDateTime>
#include <QDebug>

inline QFont g_font("荆南麦圆 2, Microsoft YaHei UI, Microsoft YaHei" ,12);

inline QString g_salt; // 全局盐
inline QString g_account; // 全局登录成功的用户
inline QString g_pwd; // 全局登录成功的用户的密码哈希


// 计算密码和盐的md5
inline QString g_calculateMad5(QString pwd){

    QString input = pwd + g_salt;

    // 将 QString 转换为 UTF-8 编码的 QByteArray
    QByteArray data = input.toUtf8 ();

    // 计算 MD5 哈希值
    QByteArray hash = QCryptographicHash::hash(data, QCryptographicHash::Md5);

    // 将哈希值转换为十六进制字符串
    QString md5 = QString(hash.toHex());

    return md5;

}


class KVQuery
{
public:
    KVQuery(){
        //因为每个请求都需要通过密钥secret和当前时间t来生成token，因此在KVQuery的构造函数中直接加入这两个字段
        m_map.insert(std::make_pair("secret", "f6fdffe48c908deb0f4c3bd36c032e72"));
        std::string secstr = std::to_string( QDateTime::currentDateTime().toSecsSinceEpoch () ); // 获取操作系统的时区下的本地时间，并转化成秒级时间戳
        m_map.insert(std::make_pair("t", secstr));
    }
    ~KVQuery() = default;

    void add(const std::string & key, const std::string & value){
        m_map.insert(std::make_pair(key, value));
    }
    void erase(const std::string & key){
        m_map.erase (key);
    }
    void clear(){
        m_map.clear ();
    }

    //转换为url中查询词的格式
    std::string toString() const{
        std::string tmp;
        for(auto & elem : m_map) {
            tmp.append(elem.first).append("=").append(elem.second).append("&");
        }
        tmp.pop_back(); // 去除尾部多余的 &
        return tmp;
    }

    std::string toCrpytString(){
        // 1. 生成原始查询字符串（不带 secret）
        std::string queryStr;
        for (const auto& elem : m_map) {
            queryStr.append(elem.first).append("=").append(elem.second).append("&");
        }
        if (!queryStr.empty()) {
            queryStr.pop_back(); // 移除末尾多余的 '&'
        }

        // 2. 计算 MD5 哈希
        QString qstr = QString::fromStdString(queryStr);
        QByteArray arr = QCryptographicHash::hash(qstr.toUtf8(), QCryptographicHash::Md5);
        QString token = arr.toHex();

        // 3. 添加 token 到查询参数
        m_map["token"] = token.toStdString();

        // 4. 移除 secret 字段（如果存在）
        m_map.erase("secret");

        // 5. 重新生成最终的查询字符串
        std::string finalQueryStr;
        for (const auto& elem : m_map) {
            finalQueryStr.append(elem.first).append("=").append(elem.second).append("&");
        }
        if (!finalQueryStr.empty()) {
            finalQueryStr.pop_back(); // 移除末尾多余的 '&'
        }

        return finalQueryStr;
    }

private:
    std::map<std::string, std::string> m_map;
};





#endif // GLOBALTABLE_HPP
